// 通过一个Map来扩展以$开头的这些属性.

// @ts-ignore
import {hasOwn} from "../shared";

// $开头的都是给用户提供的API
const publicPropertiesMap = {
    $el: (instance) => instance.vnode.el,
    $slots:(instance) => instance.slots,
    $props:(instance) => instance.props

}

export const PublicInstanceProxyHandlers = {
    //  target就是ctx,
    get({_: instance}, key: string | symbol, receiver: any): any {
        //     从setupState中去获取值
        //     如果setupState中有值,那么就直接去取,并且返回
        //  创建组件实例的时候可以给setupState一个初始值,
        //   执行玩setup函数,拿到结果赋给setupState 属性
        const {setupState, props} = instance;
        /*    if (key in setupState) {
                return setupState[key];
            }*/

        // 这里抽这个函数是否是因为这个函数名太长呢?

        if (hasOwn(setupState, key)) {
            return setupState[key];
        } else if (hasOwn(props, key)) {
            return props[key];
        }
        // debugger
        /*    if (key === '$el') {
                // 在创建组件实例的时候赋值了一个虚拟节点
                return instance.vnode.el
            }
            */
        //  重构上面的内容
        // 尝试从 publicPropertiesMap 取出key 对应的函数,如果存在的话,说明是有值的,那么直接返回这个函数的执行就行了
        const publicGetter = publicPropertiesMap[key];
        if (publicGetter) {
            return publicGetter(instance);
        }


    }
}